libostree: Silently ignore EPERM when setting EXT2_IMMUTABLE_FL
authorColin Walters <walters@verbum.org>
Wed, 4 Jun 2014 22:21:32 +0000 (18:21 -0400)
committerColin Walters <walters@verbum.org>
Mon, 9 Jun 2014 18:44:17 +0000 (14:44 -0400)
In the case of running ostree as non-root on a regular filesystem (not
tmpfs which doesn't support immutable), we should just silently do
nothing if we encounter EPERM.  Cache the result to avoid spam in
strace.

https://bugzilla.gnome.org/show_bug.cgi?id=728006

src/libostree/ostree-linuxfsutil.c

index 8e11d2cf18cb08313abdd048aff19a4538c924c5..2bfc92f22ad0f6b0eefd278b6ce34a69008d40be 100644 (file)
@@ -38,8 +38,9 @@
  * Alter the immutable flag of object referred to by @fd; may be a
  * regular file or a directory.
  *
- * If the operation is not supported by the underlying filesystem,
- * this function will silently do nothing.
+ * If the operation is not supported by the underlying filesystem, or
+ * we are running without sufficient privileges, this function will
+ * silently do nothing.
  */
 gboolean
 _ostree_linuxfs_fd_alter_immutable_flag (int            fd,
@@ -50,12 +51,18 @@ _ostree_linuxfs_fd_alter_immutable_flag (int            fd,
   gboolean ret = FALSE;
   unsigned long flags;
   int r;
+  static gint no_alter_immutable = 0;
+
+  if (g_atomic_int_get (&no_alter_immutable))
+    return TRUE;
 
   r = ioctl (fd, EXT2_IOC_GETFLAGS, &flags);
   if (r == -1)
     {
       int errsv = errno;
-      if (errsv == EOPNOTSUPP || errsv == ENOTTY)
+      if (errsv == EPERM)
+        g_atomic_int_set (&no_alter_immutable, 1);
+      else if (errsv == EOPNOTSUPP || errsv == ENOTTY)
         ;
       else
         {
@@ -75,7 +82,9 @@ _ostree_linuxfs_fd_alter_immutable_flag (int            fd,
       if (r == -1)
         {
           int errsv = errno;
-          if (errsv == EOPNOTSUPP || errsv == ENOTTY)
+          if (errsv == EPERM)
+            g_atomic_int_set (&no_alter_immutable, 1);
+          else if (errsv == EOPNOTSUPP || errsv == ENOTTY)
             ;
           else
             {